iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

從零開始學Web Framework : React篇系列 第 14

Day_14: 選擇圖片上傳並瀏覽

  • 分享至 

  • xImage
  •  

1.code

import React, {useState} from "react";

function ImageUploadPreview(){
    const [selectedImage, setSelectedImage]=useState(null);
    //處理用戶選擇圖片
    const handleImageChange=(e)=>{
        const selectedFile=e.target.files[0];
        if(selectedFile){
            //使用URL.createObjextURL創建臨時圖片URL
            const imageUrl=URL.createObjectURL(selectedFile);
            //創建一個新的Image對象,用來取得圖片的原始尺寸
            const img =new Image();
            img.src=imageUrl;
            //設置圖片的最大寬度、高度為250px
            const maxWidth=250;
            const maxHeight=250;
            img.onload=()=>{
                const width=img.width;
                const height=img.height;
                //如果圖片的寬度或高度超過250px,則進行縮放
                if(width>maxWidth||height>maxHeight){
                    const aspectRatio=width/height;
                    if(width>height){
                        img.width=maxWidth;
                        img.height=maxWidth/aspectRatio;
                    }else{
                        img.width=maxHeight*aspectRatio;
                        img.height=maxHeight;
                    }
                }
                //將縮放後的圖片顯示在預覽中
                const canvas=document.createElement('canvas');//創建一個HTML5Canvas元素
                const ctx=canvas.getContext('2d');
                //獲取Canvas的2D上下文對象,通過'getContext('2d')'可以在Canvas上進行2D圖形繪製
                canvas.width=img.width;
                canvas.height=img.height;
                ctx.drawImage(img, 0, 0, img.width, img.height);
                //將圖片轉為DateURL,使用Canvas的'toDataURL'方法將Canvas上的圖像轉為
                //DataURL,''image/jpeg''代表轉為JPEG格式的DataURL
                //圖片格式可替換,最後將DataURL存到'scaledImageUrl'
                const scaledImageUrl=canvas.toDataURL('image/jpeg');
                setSelectedImage(imageUrl);
                //將縮放後圖片的DataURL存到React組件的'selectedImage'狀態中
            };
            
        }
    };
    return(
        <div>
            <h1>Image Upload and Preview</h1>
            <input type="file"
                   accept="image/*"
                   onChange={handleImageChange}
                   />
            {selectedImage &&(<div className="image-preview">
                <img src={selectedImage}
                     alt="Preview"
                     style={{maxWidth:'250px',maxHeight:'250'}}
                     />
                </div>
                )}
        </div>
    );
}
export default ImageUploadPreview;
  1. 實作

上一篇
Day_13: 輸入正確密碼查看完整圖片
下一篇
Day15: 圖片輪播效果
系列文
從零開始學Web Framework : React篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言